﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Project.MVC.Model;
using Project.MVC.Service;
using Project.MVC.Web.Models.Grid;
using Project.MVC.Web.Helper.jqGrid;
using System.IO;
using System.Diagnostics;
namespace Project.MVC.Web.Areas.QuanLy.Controllers
{
    public class ProductController : Controller
    {
        #region Services
        private readonly IProductServices services;
        private readonly ICategoryServices servicesCategory;
        private readonly IImageServices servicesImage;
        public ProductController()
            : this(
            new ProductServices(),
            new CategoryServices(),
            new ImageServices()
            )
        {
        }

        public ProductController(
            IProductServices iServices,
               ICategoryServices iServiceCategory,
            IImageServices IServiceImage

            )
        {
            services = iServices;
            servicesCategory = iServiceCategory;
            servicesImage = IServiceImage;
        }
        #endregion
        public ActionResult Index()
        {
            return View("Index");
        }

        public ActionResult Add()
        {
            var viewModel = new ProductInfo();
            return View("Add", viewModel);
        }
        [ValidateInput(false)]
        [HttpPost]
        public ActionResult Add(ProductInfo product, FormCollection form)
        {
            getInfo(product, form, false);
            services.Insert(product);
            //service.SaveChange();
            //end add
            UploadImage(product.Id, Request.Files, 0);
            return View("Edit", product);
        }
        #region Ajax and Json methods
        public JsonResult GetList(GridSettings grid)
        {

            IQueryable<ProductInfo> list = null;
            list = services.GetList2Grid();
            //THIẾT LẬP JQUERY GRID
            list = JqGrid.SetupGrid<ProductInfo>(grid, list);

            return Json(list.ToJqGridData(grid.PageIndex, grid.PageSize, null, null, null), JsonRequestBehavior.AllowGet);
        }
        #endregion
        /// <summary>
        /// Upload hình ảnh cho dự án
        /// </summary>
        /// <param name="id">id Dự án</param>
        /// <param name="maDuAn">Mã dự án</param>
        /// <param name="files">Danh sách file hình ảnh</param>
        /// <param name="value">Số thứ tự tiếp theo của hình ảnh</param>
        [NonAction]
        private void UploadImage(int id, HttpFileCollectionBase files, int value)
        {
            var path = AppDomain.CurrentDomain.BaseDirectory + "/Content/Upload/" + id;
            if (!Directory.Exists(@path) && (files.Count > 0)) { Directory.CreateDirectory(@path); }

            var hinhMinhHoa = new ImageInfo();
            for (var i = 0; i <= files.Count - 1; i++)
            {
                var filename = files[i].FileName;

                //NẾU FILE ĐÃ TỒN TẠI THÌ XÓA VÀ THAY THẾ BỞI FILE MỚI
                if (filename.Length > 0)
                {
                    //TÊN FILE = ID + SỐ THỨ TỰ FILE
                    filename = id + "-000" + (i + value) + "." + Path.GetExtension(filename).Substring(1);
                    hinhMinhHoa.ProductId = id;
                    hinhMinhHoa.Url = filename;
                    InsertHinhMinhHoa(hinhMinhHoa);

                    if (System.IO.File.Exists(@path + "/" + filename))
                    {
                        try
                        {
                            System.IO.File.Delete(@path + "/" + filename);
                        }
                        catch (Exception)
                        {
                            //GỠ BỎ THUỘC TÍNH READ-ONLY CỦA FILE
                            ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                            psi.UseShellExecute = false;
                            psi.RedirectStandardOutput = true;
                            psi.RedirectStandardInput = true;
                            psi.RedirectStandardError = true;
                            psi.WorkingDirectory = @path;

                            //CHẠY TIẾN TRÌNH CMD
                            Process proc = Process.Start(psi);

                            //VIẾT DÒNG LỆNH VÀO CMD VÀ THỰC THI
                            StreamWriter sIn = proc.StandardInput;
                            sIn.WriteLine("attrib -a -h -r -s \"" + @path + "/" + filename + "\"");
                            sIn.WriteLine("exit");
                            proc.Close();
                            sIn.Close();

                            System.Threading.Thread.Sleep(1000);
                            System.IO.File.Delete(@path + "/" + filename);
                        }
                        try
                        {
                            files[i].SaveAs(Path.Combine(path, filename));
                        }
                        catch (Exception)
                        {
                            //GỠ BỎ THUỘC TÍNH READ-ONLY CỦA THƯ MỤC
                            ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                            psi.UseShellExecute = false;
                            psi.RedirectStandardOutput = true;
                            psi.RedirectStandardInput = true;
                            psi.RedirectStandardError = true;
                            psi.WorkingDirectory = @path;

                            //CHẠY TIẾN TRÌNH CMD
                            Process proc = Process.Start(psi);

                            //VIẾT DÒNG LỆNH VÀO CMD VÀ THỰC THI
                            StreamWriter sIn = proc.StandardInput;
                            sIn.WriteLine("attrib -a -h -r -s \"" + @path + "\"");
                            sIn.WriteLine("exit");
                            proc.Close();
                            sIn.Close();

                            System.Threading.Thread.Sleep(1000);
                            files[i].SaveAs(Path.Combine(path, filename));
                        }
                    }
                    else
                    {
                        if (files[i].FileName.Length > 0)
                        {
                            try
                            {
                                files[i].SaveAs(Path.Combine(path, filename));
                            }
                            catch (Exception)
                            {
                                //GỠ BỎ THUỘC TÍNH READ-ONLY CỦA THƯ MỤC
                                ProcessStartInfo psi = new ProcessStartInfo("cmd.exe");
                                psi.UseShellExecute = false;
                                psi.RedirectStandardOutput = true;
                                psi.RedirectStandardInput = true;
                                psi.RedirectStandardError = true;
                                psi.WorkingDirectory = @path;

                                //CHẠY TIẾN TRÌNH CMD
                                Process proccess = Process.Start(psi);

                                //VIẾT DÒNG LỆNH VÀO CMD VÀ THỰC THI
                                StreamWriter streamWriter = proccess.StandardInput;
                                streamWriter.WriteLine("attrib -a -h -r -s \"" + @path + "\"");
                                streamWriter.WriteLine("exit");
                                proccess.Close();
                                streamWriter.Close();

                                System.Threading.Thread.Sleep(1000);
                                files[i].SaveAs(Path.Combine(path, filename));
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Cập nhật hình minh họa cho dự án
        /// </summary>
        [NonAction]
        private void InsertHinhMinhHoa(ImageInfo hinhMinhHoa)
        {
            servicesImage.Insert(hinhMinhHoa);
        }

        /// <summary>
        /// Xóa hình minh họa của dự án
        /// </summary>
        public ActionResult DeleteHinhMinhHoa(int id, string tenTapTin)
        {
            //servicesImage.Delete(servicesImage.GetByKey(tenTapTin));
            //servicesImage.SaveChange();

            var path = AppDomain.CurrentDomain.BaseDirectory + "/Content/Upload/" + id;

            if (System.IO.File.Exists(@path + "/" + tenTapTin))
            {
                try
                {
                    System.IO.File.Delete(@path + "/" + tenTapTin);
                }
                catch (Exception)
                {
                    //GỠ BỎ THUỘC TÍNH READ-ONLY CỦA FILE
                    var psi = new ProcessStartInfo("cmd.exe")
                    {
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardInput = true,
                        RedirectStandardError = true,
                        WorkingDirectory = @path
                    };

                    //CHẠY TIẾN TRÌNH CMD
                    var proccess = Process.Start(psi);

                    //VIẾT DÒNG LỆNH VÀO CMD VÀ THỰC THI
                    var streamWriter = proccess.StandardInput;
                    streamWriter.WriteLine("attrib -a -h -r -s \"" + @path + "/" + tenTapTin + "\"");
                    streamWriter.WriteLine("exit");
                    proccess.Close();
                    streamWriter.Close();

                    System.Threading.Thread.Sleep(1000);
                    System.IO.File.Delete(@path + "/" + tenTapTin);
                }
            }

            return RedirectToAction("Edit", new { id = id });
        }


        #region Private methods
        private void getInfo(ProductInfo value, FormCollection form, bool isUpdate)
        {
            if (form == null) return;
            if (value == null) value = new ProductInfo();
            value.CategoryId = int.Parse(form.Get(ProductInfo.ListFieldName.CategoryId));
            value.Title = form.Get(ProductInfo.ListFieldName.Title);
            value.Description = form.Get(ProductInfo.ListFieldName.Description);
            if (isUpdate)
            {
                value.Id = int.Parse(form.Get(ProductInfo.ListFieldName.Id));
            }
        }

        #endregion
    }
}
